package Proxy;

import net.sf.cglib.proxy.Enhancer;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Mytest {

	public static void main(String[] args) {
		ProxyCglib proxy = new ProxyCglib();
		// 通过生成子类的方式创建代理类
		SayHello proxyImp = (SayHello) proxy.getProxy(SayHello.class);
		proxyImp.say();
	}
}

//创建被代理类
class SayHello {
	public void say() {
		System.out.println("hello");
	}
}

//创建代理类
class ProxyCglib implements MethodInterceptor {
	private Enhancer enhancer = new Enhancer();
	
	public Object getProxy(Class<?> clazz) {//public Object getProxy(Class<SayHello> clazz) {
		// 设置需要创建子类的类
		enhancer.setSuperclass(clazz);
		enhancer.setCallback(this);//enhancer.setCallback(new ProxyCglib());
		
		// 通过字节码技术动态创建子类实例
		return enhancer.create();
	}

	Logger log = LoggerFactory.getLogger(ProxyCglib.class);
	
	// 实现MethodInterceptor接口方法
	@Override
	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		System.out.println("可以在调用实际方法前做一些事情");
		log.info("汉字start");
		// 通过代理类调用父类中的方法
		Object result = proxy.invokeSuper(obj, args);
		log.info("汉字end");
		System.out.println("可以在调用实际方法后做一些事情");
		return result;
	}
}